package ucla.axelia.vista;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.MethodUtils;

import ucla.axelia.controlador.interfaces.IServicioAdministracionActividadPlanificada;
import ucla.axelia.controlador.interfaces.IServicioAdministracionAsignarVoluntariosActividadPlanificada;
import ucla.axelia.modelo.beans.EventualidadActividad;
import ucla.axelia.modelo.data.Actividad;
import ucla.axelia.modelo.data.ActividadPlanificada;
import ucla.axelia.modelo.data.Programa;
import ucla.axelia.modelo.data.TipoActividad;

import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.CheckBox;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.layout.GridLayoutData;

import com.obelisco.vista.componentes.ContenedorBusqueda;
import com.obelisco.vista.controles.BindingSelectField;
import com.obelisco.vista.controles.DateField;
import com.obelisco.vista.controles.Grid;
import com.obelisco.vista.controles.Label;
import com.obelisco.vista.controles.SelectField;
import com.obelisco.vista.controles.TextField;

public class ContenedorBusquedaActividadesPlanificadas extends ContenedorBusqueda {

	private IServicioAdministracionActividadPlanificada servicioAdministracionActividadPlanificada;
		
	private SelectField cmbPrograma;
	private SelectField cmbTipoActividad;
	private TextField txtNombreActividad;
	private SelectField cmbEventualidad;
	private CheckBox chkNoAplicaFecha;
	private DateField dateFechaPlanificacion;
	
	private String modo = null;
	
		
	public ContenedorBusquedaActividadesPlanificadas(){
		super();		
	}
	
	private ActionListener chkNoAplicaFechaListener = new  ActionListener() {
		public void actionPerformed(ActionEvent Arg) {
			dateFechaPlanificacion.setVisible(!chkNoAplicaFecha.isSelected());
		}
	};
	
	private void initComponents() {
		this.removeAll();
		
	    Grid grdBusqueda = new Grid();
		grdBusqueda.setWidth(new Extent(100, Extent.PERCENT));
		grdBusqueda.setSize(4);
		grdBusqueda.setStyleName("Obelisco.GridPaneDialogo");
				
		Label lblPrograma = new Label("Programa");
		grdBusqueda.add(lblPrograma);
		cmbPrograma = new SelectField(120);
		grdBusqueda.add(cmbPrograma);
		
		Label lblTipoActividad = new Label("Tipo");
		grdBusqueda.add(lblTipoActividad);
		cmbTipoActividad = new SelectField(120);
		cmbTipoActividad.setNombreItemDefecto("No Aplica");
		grdBusqueda.add(cmbTipoActividad);
		
		Label lblEventualidad = new Label("Eventualidad");
		grdBusqueda.add(lblEventualidad);
		cmbEventualidad = new SelectField(120);
		grdBusqueda.add(cmbEventualidad);
		
		Label lblNombreActividad = new Label("Nombre");
		grdBusqueda.add(lblNombreActividad);
		txtNombreActividad = new TextField(200);
		txtNombreActividad.setMaximumLength(50);
		grdBusqueda.add(txtNombreActividad);
				
		Label lblFechaPlanificacion = new Label("Fecha");
		grdBusqueda.add(lblFechaPlanificacion);
		Row row1=new Row();	
		GridLayoutData gridLayout1por4 = new GridLayoutData();
		gridLayout1por4.setAlignment(new Alignment(Alignment.LEFT, Alignment.CENTER));
		gridLayout1por4.setColumnSpan(3);
		row1.setLayoutData(gridLayout1por4);
		
		chkNoAplicaFecha= new CheckBox();
		chkNoAplicaFecha.setText("No Aplica-");
		chkNoAplicaFecha.setActionCommand("1");
		chkNoAplicaFecha.addActionListener(this.chkNoAplicaFechaListener);
		row1.add(chkNoAplicaFecha);
		dateFechaPlanificacion= new DateField();
		row1.add(dateFechaPlanificacion);
		
		grdBusqueda.add(row1);		
		this.add(grdBusqueda);
	}
	
	public Object[] getValoresParametros() {
		return null;
	}
	
	@Override
	public void inicializar() {
		// TODO Auto-generated method stub		
		initComponents();
		
		cmbPrograma.setNombreItemDefecto("Cualquiera");
		List programas = servicioAdministracionActividadPlanificada.buscarProgramasPorUsuarioActual();		
		cmbPrograma.inicializarDatos(programas, "nombrePrograma", "idPrograma");
		
		cmbTipoActividad.setNombreItemDefecto("Cualquiera");
		List tiposActividad = servicioAdministracionActividadPlanificada.buscarTipoActividades();		
		cmbTipoActividad.inicializarDatos(tiposActividad, "nombreTipoActividad", "idTipoActividad");		
		
		cmbEventualidad.setNombreItemDefecto("Cualquiera");
		List eventualidades = EventualidadActividad.getEventualidadesActividad();		
		cmbEventualidad.inicializarDatos(eventualidades, "nombre", "id");
		
		chkNoAplicaFecha.setSelected(true);
		dateFechaPlanificacion.setVisible(false);
	}

	@Override
	public List realizarBusqueda() {
		// TODO Auto-generated method stub
		Map<String, Object> criterios = new HashMap();
		List programas = new ArrayList();
		if ((cmbPrograma.getSelectedItem()!=null) && 
			(!cmbPrograma.getSelectedItem().toString().equals(cmbPrograma.getNombreItemDefecto()))) {
			programas.add(cmbPrograma.getSelectedItem());
			criterios.put("actividad.programa", programas);
		}
		if ((cmbTipoActividad.getSelectedItem()!=null) && 
			(!cmbTipoActividad.getSelectedItem().toString().equals(cmbTipoActividad.getNombreItemDefecto()))) {
			criterios.put("actividad.tipoActividad.idTipoActividad", ((TipoActividad)cmbTipoActividad.getSelectedItem()).getIdTipoActividad());
		}		
		if ((cmbEventualidad.getSelectedItem()!=null) && 
			(!cmbEventualidad.getSelectedItem().toString().equals(cmbEventualidad.getNombreItemDefecto()))) {
			criterios.put("actividad.eventualidad", ((EventualidadActividad)cmbEventualidad.getSelectedItem()).getId());
		}		
		if (!txtNombreActividad.getText().trim().equals("")) {
			criterios.put("actividad.nombreActividad", txtNombreActividad.getText().trim());
		}		
		if(!chkNoAplicaFecha.isSelected()) {
			Date fechaAux = dateFechaPlanificacion.getSelectedDate().getTime();
			criterios.put("fechaReferencial",fechaAux);
		}		
		if (this.modo!=null) {			
			criterios.put("modo", this.modo);
		}
		
		List actividadesPlanificadas = servicioAdministracionActividadPlanificada.buscarActividadesPlanificadasPorCriterios(criterios);				
		return actividadesPlanificadas;
	}
	

	// Getter y Setter
	public String getModo() {
		return modo;
	}

	public void setModo(String modo) {
		this.modo = modo;
	}

	public IServicioAdministracionActividadPlanificada getServicioAdministracionActividadPlanificada() {
		return servicioAdministracionActividadPlanificada;
	}

	public void setServicioAdministracionActividadPlanificada(
			IServicioAdministracionActividadPlanificada servicioAdministracionActividadPlanificada) {
		this.servicioAdministracionActividadPlanificada = servicioAdministracionActividadPlanificada;
	}

}
